protected function getLagFromPtHeartbeat() {
$masterInfo = $this->getMasterServerInfo();
if ( !$masterInfo ) {
+ wfLogDBError(
+ "Unable to query master of {db_server} for server ID",
+ $this->getLogContext( array(
+ 'method' => __METHOD__
+ ) )
+ );
+
return false; // could not get master server ID
}
return max( $nowUnix - $timeUnix, 0.0 );
}
+ wfLogDBError(
+ "Unable to find pt-heartbeat row for {db_server}",
+ $this->getLogContext( array(
+ 'method' => __METHOD__
+ ) )
+ );
+
return false;
}
if ( isset( $this->mServers[$i]['max lag'] ) ) {
$maxServerLag = min( $maxServerLag, $this->mServers[$i]['max lag'] );
}
+
+ $host = $this->getServerName( $i );
if ( $lag === false ) {
- wfDebugLog( 'replication', "Server #$i is not replicating" );
+ wfDebugLog( 'replication', "Server $host (#$i) is not replicating?" );
unset( $loads[$i] );
} elseif ( $lag > $maxServerLag ) {
- wfDebugLog( 'replication', "Server #$i is excessively lagged ($lag seconds)" );
+ wfDebugLog( 'replication', "Server $host (#$i) has >= $lag seconds of lag" );
unset( $loads[$i] );
}
}
*
* @param int $i Server index
* @param string|bool $wiki Wiki ID, or false for the current wiki
- * @return DatabaseBase
- *
- * @access private
+ * @return DatabaseBase|bool Returns false on errors
*/
public function openConnection( $i, $wiki = false ) {
if ( $wiki !== false ) {
$lagTimes = array();
foreach ( $serverIndexes as $i ) {
- if ( $i == 0 ) { # Master
- $lagTimes[$i] = 0;
+ if ( $i == $this->parent->getWriterIndex() ) {
+ $lagTimes[$i] = 0; // master always has no lag
continue;
}
+
$conn = $this->parent->getAnyOpenConnection( $i );
- if ( $conn !== false ) {
- $lagTimes[$i] = $conn->getLag();
+ if ( $conn ) {
+ $close = false; // already open
+ } else {
+ $conn = $this->parent->openConnection( $i, $wiki );
+ $close = true; // new connection
+ }
+
+ if ( !$conn ) {
+ $lagTimes[$i] = false;
+ $host = $this->parent->getServerName( $i );
+ wfDebugLog( 'replication', __METHOD__ . ": host $host (#$i) is unreachable" );
continue;
}
- $conn = $this->parent->openConnection( $i, $wiki );
- if ( $conn !== false ) {
- $lagTimes[$i] = $conn->getLag();
+
+ $lagTimes[$i] = $conn->getLag();
+ if ( $lagTimes[$i] === false ) {
+ $host = $this->parent->getServerName( $i );
+ wfDebugLog( 'replication', __METHOD__ . ": host $host (#$i) is not replicating?" );
+ }
+
+ if ( $close ) {
# Close the connection to avoid sleeper connections piling up.
# Note that the caller will pick one of these DBs and reconnect,
# which is slightly inefficient, but this only matters for the lag
}
private function getLagTimeCacheKey() {
+ $writerIndex = $this->parent->getWriterIndex();
// Lag is per-server, not per-DB, so key on the master DB name
- return $this->srvCache->makeGlobalKey( 'lag-times', $this->parent->getServerName( 0 ) );
+ return $this->srvCache->makeGlobalKey(
+ 'lag-times', $this->parent->getServerName( $writerIndex )
+ );
}
}